/*
给出两个数集，它们的相似程度定义为Nc/Nt*100%。其中，Nc表示两个数集的交集中元素的个数，而Nt表示两个数集的并集中元素的个数。请计算任意两个给出数集的相似程度。
Input
输入第一行给出一个正整数N（N<=50），是集合的个数。随后N行，每行对应一个集合。每个集合首先给出一个正整数M（M<=5000），
是集合中元素的个数；然后跟M个[0, 3000]区间内的整数。
之后一行给出一个正整数K（K<=800），随后K行，每行对应一对需要计算相似度的集合的编号（集合从1到N编号）。数字间以空格分隔。

Output
输出共K行，每行一个保留2位小数的实数，表示给定两个集合的相似度值。

Sample Input
3 
3 99 87 101 
4 87 101 5 87 
7 99 101 18 5 135 18 99 
2 
1 2 
1 3 

Sample Output
50.00% 
33.33%
*/
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define MAX 51
set<int> a[MAX];
set<int>::iterator itx;
set<int>::iterator ity;
int jiao(int x, int y) //x号与y号数集交集内容个数
{
    int num=0;
    for(itx=a[x].begin();itx!=a[x].end();itx++)
    {
        for(ity=a[y].begin();ity!=a[y].end();ity++)
        {
            if(*itx == *ity)
                num++;
        }
    }
    return num;
}

int bing(int x, int y) //x号与y号数集并集内容个数
{
    a[MAX].clear();//必须清空作为合并缓存的a[51] set
    for(itx=a[x].begin();itx!=a[x].end();itx++)
    {
        a[MAX].insert(*itx);
    }
    for(ity=a[y].begin();ity!=a[y].end();ity++)
    {
        a[MAX].insert(*ity);
    }
    return a[MAX].size();
}
int main()
{
    int n, m, x, y ,i, j, k, numx, numy;
    double ans;
    while (cin >> n)
    {
        for (i = 1; i <= n; i++)
        {
            a[i].clear();
        }
        for (i = 1; i <= n; i++)
        {
            cin >> m;
            for (j=1;j<=m;j++)
            {
                cin>>x;
                a[i].insert(x);//输入数集i的内容
            }
        }
        cin>>k;
        for (i = 1; i <= k; i++)
        {
            cin>>x>>y;//对比x号与y号数集相似度
            numx=jiao(x,y);
            numy=bing(x,y);
            //printf("%d %d\n",numx,numy);
            ans = (1.0*numx/numy)*100;
            printf("%.2lf%%\n",ans);
        }

    }
    return 0;
}
